home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / vbrdobtn / vbrdobtn.c < prev    next >
C/C++ Source or Header  |  1992-05-21  |  24KB  |  722 lines

  1. #include "windows.h"
  2. #include "vbapi.h"
  3.  
  4. /********************************************************************************************************************************
  5.  
  6.                               Custom 3-D buttons for Visual Basic  by Mark Gamber, March 1992
  7.  
  8.               This code may be freely distributed and modified. Because of this, it is not supported by the author.
  9.  
  10. ********************************************************************************************************************************/
  11.  
  12.  
  13. LONG FAR PASCAL _export MainWndProc( HCTL, HWND, WORD, WORD, LONG );                                  /*  Function prototypes  */
  14. void PaintControl( HCTL, HWND );
  15. void AutoCheck( HCTL, HWND );
  16. BOOL _export FAR PASCAL SetColor( HWND, WORD, WORD, LONG );
  17. LONG _export FAR PASCAL PopupWndProc( HWND, WORD, WORD, LONG );
  18.  
  19. typedef struct {                                                                                 /*  Structure passed by hCtl  */
  20.    long Color;
  21.    long CheckBorderColor;
  22.    long ShadowColor;
  23.    int Shadow;
  24.    int Xsize, Ysize;
  25.    int Selected;
  26.    int ButtonDown;
  27.    HFONT hFont;
  28.    char Caption[ 129 ];
  29. } BTNSTRUCT;
  30.  
  31. #define DEREF(hctl)  ((BTNSTRUCT far *)VBDerefControl(hctl))                  /*  Method to access above structure using hCtl  */
  32.  
  33.  
  34. /*******************************************        Control Properties        **************************************************/
  35.  
  36. char ValueList[] = "0 - Unchecked\0"\
  37.                    "1 - Checked\0"\
  38.                    "";
  39.  
  40. char *CLASSPOPUP = "CPopup";
  41.  
  42. PROPINFO piValue =
  43. {
  44.    "Value",
  45.    DT_ENUM | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  46.    0, 0, 0, ValueList, 1
  47. };
  48.  
  49. PROPINFO piCheckColor =
  50. {
  51.    "CheckColor",
  52.    DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData | PF_fEditable,
  53.    0, 0, NULL, 0
  54. };
  55.  
  56. PROPINFO piCheckBorderColor =
  57. {
  58.    "ChkBrdColor",
  59.    DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData | PF_fEditable,
  60.    0, 0, NULL, 0
  61. };
  62.  
  63. PROPINFO piShadow =
  64. {
  65.    "TextShadow",
  66.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  67.    0, 0, NULL, 0
  68. };
  69.  
  70. PROPINFO piShadowColor =
  71. {
  72.    "TextShadowCol",
  73.    DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  74.    0, 0, NULL, 0
  75. };
  76.  
  77. PROPINFO piVersion =
  78. {
  79.    "Version",
  80.    DT_SHORT | PF_fGetMsg,
  81.    0, 0, NULL, 0
  82. };
  83.  
  84. PPROPINFO proplistBtn[] =                                                     /*  Properties supported by this control module  */
  85. {                                                                         /*  Note: Does not have to be in a particular order  */
  86.    PPROPINFO_STD_CTLNAME,
  87.    PPROPINFO_STD_CAPTION,
  88.    PPROPINFO_STD_BACKCOLOR,
  89.    PPROPINFO_STD_FORECOLOR,
  90.    PPROPINFO_STD_LEFT,
  91.    PPROPINFO_STD_TOP,
  92.    PPROPINFO_STD_HEIGHT,
  93.    PPROPINFO_STD_WIDTH,
  94.    PPROPINFO_STD_INDEX,
  95.    PPROPINFO_STD_FONTNAME,
  96.    PPROPINFO_STD_FONTBOLD,
  97.    PPROPINFO_STD_FONTITALIC,
  98.    PPROPINFO_STD_FONTSTRIKE,
  99.    PPROPINFO_STD_FONTUNDER,
  100.    PPROPINFO_STD_FONTSIZE,
  101.    PPROPINFO_STD_ENABLED,
  102.    PPROPINFO_STD_MOUSEPOINTER,
  103.    PPROPINFO_STD_TABINDEX,
  104.    PPROPINFO_STD_TABSTOP,
  105.    PPROPINFO_STD_DRAGICON,
  106.    PPROPINFO_STD_DRAGMODE,
  107.    &piValue,
  108.    &piCheckColor,
  109.    &piCheckBorderColor,
  110.    &piShadow,
  111.    &piShadowColor,
  112.    &piVersion,
  113.    NULL,
  114. };
  115.  
  116. #define PROP_BASE          21                                                  /*  Definitions for easier property management  */
  117. #define PROP_VALUE         PROP_BASE
  118. #define PROP_COLOR         (PROP_BASE+1)
  119. #define PROP_CHKBRDCOLOR   (PROP_BASE+2)
  120. #define PROP_SHADOW        (PROP_BASE+3)
  121. #define PROP_SHADOWCOLOR   (PROP_BASE+4)
  122. #define PROP_VERSION       (PROP_BASE+5)
  123.  
  124. /***********************************************        Control Events        **************************************************/
  125.  
  126. EVENTINFO peClick =                                                                          /*  Description of "Click" event  */
  127. {
  128.    "Click",
  129.    0, 0, NULL, NULL
  130. };
  131.  
  132. PEVENTINFO eventlistBtn[] =                                                      /*  List of events supported by this control  */
  133. {                                                                                /*  Note: This MUST be in alphabetical order  */
  134.    &peClick,
  135.    PEVENTINFO_STD_DBLCLICK,
  136.    PEVENTINFO_STD_GOTFOCUS,
  137.    PEVENTINFO_STD_KEYDOWN,
  138.    PEVENTINFO_STD_KEYPRESS,
  139.    PEVENTINFO_STD_KEYUP,
  140.    PEVENTINFO_STD_LOSTFOCUS,
  141.    NULL
  142. };
  143.  
  144. #define EVENT_CLICK          0
  145.  
  146. char CONTROLNAME[] = "Radio3D";
  147.  
  148. MODEL modelBtn =                                                                        /*  Model for custom checkbox control  */
  149. {                                                                       /*  This is similar to registering a class in Windows  */
  150.    VB_VERSION,
  151.    MODEL_fFocusOk | MODEL_fMnemonic,                                                         /*  Ok to accept focus from form  */
  152.    (PCTLPROC)MainWndProc,
  153.    NULL,
  154.    WS_CHILD | BS_OWNERDRAW,                                                                              /*  Ownerdraw button  */
  155.    sizeof(BTNSTRUCT),                                                           /*  Size of user-defined structure from above  */
  156.    8000,                                                                           /*  Number of first bitmap used in toolbox  */
  157.    CONTROLNAME,
  158.    CONTROLNAME,                                                                                              /*  Control name  */
  159.    "button",                                                                       /*  Subclassing a Windows "button" control  */
  160.    proplistBtn,
  161.    eventlistBtn                                                                  /*  Include property and event support lists  */
  162. };
  163.  
  164.  
  165. /*********************************************  Standard VB DLL Code sections  *************************************************/
  166.  
  167. HANDLE hmodDLL;
  168. HCTL ColorHctl;
  169. HWND ColorHwnd;
  170. WORD ColorID;
  171.  
  172.  
  173. BOOL FAR PASCAL LibMain( HANDLE hmod, HANDLE segDS, USHORT cbHeapSize )                 /*  Called when Windows loads the DLL  */
  174. {
  175.    hmodDLL = hmod;                                                                  /*  Save data selector in global variable  */
  176.    UnlockData( 0 );                                                    /*  Unlock the default data segment (Make it moveable)  */
  177.  
  178.    return( TRUE );
  179. }
  180.  
  181.  
  182. BOOL FAR PASCAL _export VBINITCC( USHORT usVersion, BOOL fRunTime )                      /*  Called when VB loads the control  */
  183. {
  184.    if( ! fRunTime )
  185.    {
  186.       WNDCLASS wc;
  187.  
  188.       wc.style = 0;
  189.       wc.lpfnWndProc = (WNDPROC)PopupWndProc;
  190.       wc.cbClsExtra = 0;
  191.       wc.cbWndExtra = 0;
  192.       wc.hInstance = hmodDLL;
  193.       wc.hIcon = NULL;
  194.       wc.hCursor = NULL;
  195.       wc.hbrBackground = NULL;
  196.       wc.lpszMenuName = NULL;
  197.       wc.lpszClassName = CLASSPOPUP;
  198.  
  199.       if( ! RegisterClass( &wc ) )
  200.          return( FALSE );
  201.    }
  202.    return( VBRegisterModel( hmodDLL, &modelBtn ) );                                           /*  Just register the button(s)  */
  203. }
  204.  
  205.  
  206.  
  207. /**********************************************  Window control procedure  *****************************************************/
  208.  
  209.                                                                                                    /*  Button control routine  */
  210. LONG FAR PASCAL _export MainWndProc( HCTL hCtl, HWND hWnd, WORD msg, WORD wParam, LONG lParam )
  211. {
  212.    switch( msg )
  213.    {
  214.       case VBN_DRAWITEM:                                                    /*  Control needs repainted...same as WM_DRAWITEM  */
  215.       {
  216.          LPDRAWITEMSTRUCT lpDs = (LPDRAWITEMSTRUCT)lParam;
  217.          BTNSTRUCT far *Bs = DEREF( hCtl );
  218.          TEXTMETRIC tm;
  219.          RECT Rect;
  220.  
  221.          if( lpDs->itemAction & ODA_FOCUS )
  222.          {
  223.             if( Bs->hFont )
  224.                SelectObject( lpDs->hDC, Bs->hFont );
  225.  
  226.             GetTextMetrics( lpDs->hDC, &tm );
  227.             Rect.top = 0;
  228.             Rect.left = 16;
  229.             Rect.right = Bs->Xsize - 1;
  230.             Rect.bottom = Bs->Ysize - 1;
  231.  
  232.             DrawFocusRect( lpDs->hDC, &Rect );
  233.             return